www.gusucode.com > 串口测试程序,用于调试rs485接口 串口通信的程序 > 串口测试程序,用于调试rs485接口 串口通信的程序/commtest/MPZJ.cpp
// MPZJ.cpp: implementation of the CMPZJ class. // ////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include "MPZJ.h" #include <stdlib.h> #include <string.h> ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// //const int CMPZJ::METER_GB_ITEM[1000] = {0,0}; CMPZJ::CMPZJ() { } //tm CMPZJ::~CMPZJ() { } int CMPZJ::FormCheckClock(BYTE *buff,time_t *m_time , BYTE * addr)//设置电表时钟 { return 0; } int CMPZJ::FormReadDataFrame(BYTE *buff, int item , BYTE * addr)//读取数据 { int m_Item = CheckItem(item); if( m_Item == 0) return 0; BYTE DI0 = m_Item & 0xFF; BYTE DI1 = (m_Item >> 8) & 0xFF ; buff[0] = 0xfe; buff[1] = 0x68; buff[2] = 0x03; buff[3] = 0x03; buff[4] = 0x68; buff[5] = addr[0]; buff[6] = DI0;//控制码 buff[7] = DI1; //数据长度 buff[8] = GetCheckSum(buff + 5, 3); buff[9] = 0x0D; buff[10]= 0x00; return 11; } int CMPZJ::FormSetAddress(BYTE *buff, BYTE *addr)//设置电表地址 { return 0; } int CMPZJ::ProcReturnedFrame(BYTE *inbuff, int inLen,int item, BYTE *outbuff,int &outlen,BYTE *addr) { int i =0; while( i < (inLen - 7))//2*0x68 + 2 * Len + 1 * 0x0D + 1 * crc + 1 * addr { if(inbuff[i] == 0x68 && inbuff[i + 3] == 0x68 && inbuff[i + 1] == inbuff[i + 2])//找到数据帧头部 { break; } i++; } if(i >= (inLen - 7))//在有效数据长度内没有找到同步字 { return 0x0100;//数据长度不正确 } BYTE *pData = &inbuff[i];//数据起始 BYTE Len = pData[1] + 2 + 4;//2*0x68 + 2 * Len if(Len > inLen - i) { return 0x0100; } if(pData[Len - 1] != 0x0D) { return 0x0200;//没有结束标志 } BYTE m_check = GetCheckSum(pData + 4,Len - 6); if(m_check != pData[Len - 2]) { return 0x0300; //校验和不对 } return ProcFullFrame( pData, item, outbuff, outlen, addr); } int CMPZJ::CheckItem(int Item_data) { int data = Item_data & 0x3FFF;//bit15 bit14 == 1 表示设置,==0 表示查询 char LoBYTE = Item_data & 0xFF; char HiBYTE = ( Item_data & 0xFF00 ) >> 8; char LoBCD = LoBYTE & 0x0F; char HiBCD = (LoBYTE & 0xF0) >> 4; switch(HiBYTE) { case 0x01://当前电量 case 0x02://上月电量 上月需量 if(LoBYTE == 0x00) return data; if((HiBCD >= 1 && HiBCD <= 6) && (LoBCD >= 0 &&LoBCD <= 5)) return data; break; case 0x03: if(LoBYTE == 0x00) return data; if(LoBYTE >= 0x10 && LoBYTE <= 0x18) return data; break; case 0x04: if(LoBYTE == 0x00) return data; if(LoBYTE >= 0x10 && LoBYTE <= 0x1A) return data; break; case 0x05: if(LoBYTE == 0x00) return data; if((LoBYTE >= 0x10 && LoBYTE <= 0x16 ) ||(LoBYTE >= 0x20 && LoBYTE <= 0x27)) return data; break; case 0x06: if(LoBYTE == 0x00) return data; if((LoBYTE >= 0x10 && LoBYTE <= 0x15 ) ||(LoBYTE >= 0x20 && LoBYTE <= 0x25)) return data; break; case 0x07: if(LoBYTE == 0x00) return data; if(LoBYTE >= 0x10 && LoBYTE <= 0x2F ) return data; break; default: return 0; } return 0; } int CMPZJ::ProcFullFrame(BYTE *data, int item,BYTE *outbuff,int &outlen, BYTE *addr)//返回完整数据帧处理 { if( addr[0] != data[4] )//地址不一侄 { return 0x0400;//地址不一样 } if(data[ 1 ] == 0x01) { return 0x0600;//终端无数据 } if(data[ 1] == 0x02) { if(data[ 5 ] == 0xF0) return 0x0600;//终端无数据; else return 0; } if( item != (data[ 6 ] * 256 + data[5])) return 0x0500; outlen = (int) data[1] - 3; memcpy( (void *)outbuff, (void *)&data[7], data[1] - 3 ); return 0; } int CMPZJ::ChangeDataFromZJToGB(BYTE *pInData,BYTE pOutData,BYTE ItemZJ,BYTE ItemGB) { return 0; } ///////////////////////////////////////////////////////////////////////////// typedef struct { int Item; BYTE Len; BYTE Flags; }ITEM_LEN;//数据项目的信息